package edu.nepu.flink.api.statebackend;

import org.apache.flink.contrib.streaming.state.EmbeddedRocksDBStateBackend;
import org.apache.flink.runtime.state.hashmap.HashMapStateBackend;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.TernaryBoolean;

/**
 * @Date 2024/3/3 15:38
 * @Created by chenshuaijun
 */
public class StateBackendOverview {

    public static void main(String[] args) {
        /**
         * TODO 状态后端的概述
         *  状态后端的定义：flink提供了状态后端，用来指定状态的存储方式和存储位置
         * flink的状态后端分成两种：
         * 1、 HashMapStateBackend (默认)
         *     将状态存储在taskManager的堆内存，因为HashMapStateBackend状态后端效率是比较的高的，
         *     但是不能存储大状态，如果状态过大，会导致堆内存溢出，或者checkpoint的时间过长
         * 2、RocksDBStateBackend
         *     将状态存储在本地的rocksDB数据库中，所以理论上只要磁盘空间够大，就可以存储很大的状态，
         *     同时还提供了增量存储的功能，但是状态的存取需要序列化和反序列化，因此效率不高、
         * 下面给出状态后端的使用方式
         */

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // 设置状态后端为HashMapStateBackend
        env.setStateBackend(new HashMapStateBackend());
        // 设置状态后端为RocksDS状态后端
        // 创建的时候，可以指定是否开启增量检查点
        EmbeddedRocksDBStateBackend rocksDBStateBackend = new EmbeddedRocksDBStateBackend(TernaryBoolean.TRUE);
        env.setStateBackend(rocksDBStateBackend);
    }
}
